import 'package:flutter/material.dart';
import '../repositories/user_repository.dart';
import '../models/user_models.dart';

/// 用户状态管理器 (Provider)
///
/// 负责:
/// 1. 获取和管理当前登录用户的信息。
/// 2. 获取和缓存其他用户的信息，以供App各处使用。
class UserProvider with ChangeNotifier {
  final UserRepository _userRepository;

  UserProvider({required UserRepository repo}) : _userRepository = repo;

  /// 当前登录的用户信息
  User? _currentUser;

  /// 其他用户的缓存，以用户ID (String) 为key
  final Map<String, User> _userCache = {};

  /// 全局错误信息
  String? _error;

  /// 获取当前登录的用户信息
  User? get currentUser => _currentUser;

  /// 获取错误信息
  String? get error => _error;

  /// 获取并更新当前登录的用户信息
  ///
  /// 这个方法专门用于登录后设置当前用户信息。
  /// - [uid] 当前登录用户的ID (String)。
  Future<void> fetchCurrentUser(String uid) async {
    final userInfo = await getUserInfo(uid);
    if (userInfo != null) {
      _currentUser = userInfo;
      notifyListeners();
    }
  }

  /// 通用方法：根据UID获取任何用户的信息
  ///
  /// 优先从缓存中读取，如果缓存中没有，则通过网络请求获取，并存入缓存。
  /// - [uid] 需要获取信息的用户ID (String)。
  Future<User?> getUserInfo(String uid) async {
    if (_userCache.containsKey(uid)) {
      return _userCache[uid];
    }

    try {
      final userInfo = await _userRepository.info(userId: uid);
      _userCache[uid] = userInfo;
      return userInfo;
    } catch (e) {
      _error = '获取用户(ID: $uid)信息失败: $e';
      return null;
    }
  }

  /// 清除当前用户信息（例如，在用户登出时调用）
  void clearCurrentUser() {
    _currentUser = null;
    notifyListeners();
  }
}
